package common

import (
	"encoding/json"
	"fmt"
	"net"
	"net/http"
)

// IPInfo IP地址信息
type IPInfo struct {
	IP      string `json:"ip"`
	Country string `json:"country"`
	City    string `json:"city"`
}

// IPUtil IP地址工具类
type IPUtil struct{}

// NewIPUtil 创建IP地址工具实例
func NewIPUtil() *IPUtil {
	return &IPUtil{}
}

// GetIPInfo 获取IP地址信息（包级函数）
func GetIPInfo(ip string) (*IPInfo, error) {
	ipUtil := NewIPUtil()
	return ipUtil.GetIPInfo(ip)
}

// GetIPInfo 获取IP地址信息（实例方法）
func (i *IPUtil) GetIPInfo(ip string) (*IPInfo, error) {
	// 验证IP地址格式
	if !isValidIP(ip) {
		return nil, fmt.Errorf("无效的IP地址: %s", ip)
	}

	// 获取地理位置信息
	url := fmt.Sprintf("http://ip-api.com/json/%s", ip)
	resp, err := http.Get(url)
	if err != nil {
		return &IPInfo{
			IP:      ip,
			Country: "未知",
			City:    "未知",
		}, nil
	}
	defer resp.Body.Close()

	var ipInfo IPInfo
	if err := json.NewDecoder(resp.Body).Decode(&ipInfo); err != nil {
		return &IPInfo{
			IP:      ip,
			Country: "未知",
			City:    "未知",
		}, nil
	}

	ipInfo.IP = ip
	return &ipInfo, nil
}

// isValidIP 验证IP地址格式
func isValidIP(ip string) bool {
	// 检查是否是内网IP
	if ip == "127.0.0.1" || ip == "::1" || ip == "localhost" {
		return true
	}

	// 解析IP地址
	parsedIP := net.ParseIP(ip)
	if parsedIP == nil {
		return false
	}

	return true
}

// IsPrivateIP 检查是否是内网IP
func (i *IPUtil) IsPrivateIP(ip string) bool {
	parsedIP := net.ParseIP(ip)
	if parsedIP == nil {
		return false
	}
	return parsedIP.IsPrivate() || parsedIP.IsLoopback()
}
